package useDeprecatedAPI;


import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.StringReader;
import java.io.StringWriter;
import java.text.DateFormat;

/*
弃用API： gson2.11.0
GsonBuilder.setDateFormat(int):配置 Gson 将 Date 对象序列化为指定格式的字符串。int 参数代表日期样式.
GsonBuilder.setLenient():设置解析器为宽松模式，这意味着它会接受一些违反标准 JSON 规范的内容，如多余的逗号、非标准的数字格式等。
JsonReader.setLenient(boolean):设置 JsonReader 的解析模式为宽松或严格。
如果设置为 true，则解析器会宽松地处理 JSON 数据，允许一些非标准的格式。
如果设置为 false，则解析器会严格按照 JSON 标准进行解析。
JsonWriter.setLenient(boolean):控制 JSON 写入器的严格性，允许序列化一些非标准的 JSON 格式。
 */
/*
函数调用解释：(不是很好联系)
通过共同控制 JSON 的解析和序列化过程中的宽松性和格式化方式相互影响
 */
public class LenientJsonParsingAndSerialization {
    public static void processJsonData() {
        try {
            // 创建一个 JSON 字符串，其中包含一个日期
            String jsonString = "{\"date\":\"2023-12-31 13:45:00\", \"name\":\"Alice\"}";

            //  创建 GsonBuilder 并设置日期格式
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.setDateFormat(DateFormat.MEDIUM); // 设置日期格式
            Gson gson = gsonBuilder.create();

            // 打印原始 JSON 字符串
            System.out.println("原始 JSON 字符串：" + jsonString);

            //  配置 Gson 解析器为宽松模式
            gsonBuilder.setLenient(); // 设置宽松模式
            Gson lenientGson = gsonBuilder.create();

            //  创建 JsonReader，并设置为宽松模式
            StringReader stringReader = new StringReader(jsonString);
            JsonReader jsonReader = new JsonReader(stringReader);
            jsonReader.setLenient(true); // 设置为宽松模式，允许解析非标准格式

            //  使用 JsonReader 解析 JSON 数据
            JsonElement jsonElement = lenientGson.fromJson(jsonReader, JsonObject.class);
            System.out.println("通过宽松模式解析后的 JSON 元素：" + jsonElement);

            //  解析 JSON 元素中的日期字段
            JsonPrimitive datePrimitive = jsonElement.getAsJsonObject().get("date").getAsJsonPrimitive();
            System.out.println("提取的日期字符串：" + datePrimitive.getAsString());

            //  将 JSON 数据序列化为输出流，使用 JsonWriter 且设置为宽松模式
            StringWriter stringWriter = new StringWriter();
            JsonWriter jsonWriter = new JsonWriter(stringWriter);
            jsonWriter.setLenient(true); // 设置为宽松模式
            gson.toJson(jsonElement, jsonWriter);

            // 打印序列化后的 JSON 字符串
            System.out.println("通过宽松模式序列化后的 JSON 字符串：" + stringWriter.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
